package config

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"log"
)

// Init 读取配置文件到内存(各个配置变量)
func Init() {
	var err error

	// 配置文件路径
	viper.AddConfigPath("config")

	// 配置文件
	viper.SetConfigName("application")
	viper.SetConfigType("yaml")
	err = viper.ReadInConfig()
	if err != nil {
		log.Fatalf("setting.Setup, fail to parse ReadInConfig': %v", err)
	}

	loadConfig()

	// 对配置文件进行监视，若有改变就重新反序列到Conf中
	viper.WatchConfig()
	viper.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("配置文件修改了...")
		loadConfig()
	})
	return
}
func loadConfig() {
	// 解析数据库相关配置
	DatabaseConfig.Type = viper.GetString("datasource.type")
	DatabaseConfig.User = viper.GetString("datasource.user")
	DatabaseConfig.Password = viper.GetString("datasource.password")
	DatabaseConfig.Host = viper.GetString("datasource.host")
	DatabaseConfig.Name = viper.GetString("datasource.name")
	DatabaseConfig.MaxIdleConns = viper.GetInt("datasource.maxIdleConns")
	DatabaseConfig.MaxOpenConns = viper.GetInt("datasource.maxOpenConns")

	ServerConfig.Host = viper.GetString("server.host")

	FileUploadConfig.UploadPath = viper.GetString("file.uploadPath")
	FileUploadConfig.PreviewPath = viper.GetString("file.previewPath")
}

// DatabaseConfig 数据库配置
var DatabaseConfig = &Database{}

// Database 数据库配置封装
type Database struct {
	// 数据库类型
	Type string `mapstructure:"type"`
	// 数据库用户名
	User string `mapstructure:"user"`
	// 数据库密码
	Password string `mapstructure:"password"`
	// 数据库地址
	Host string `mapstructure:"host"`
	// 库名
	Name string `mapstructure:"name"`
	// 最大空闲连接数量
	MaxIdleConns int `mapstructure:"maxIdleConns"`
	// 最大连接数量
	MaxOpenConns int `mapstructure:"maxOpenConns"`
}

// FileUploadConfig 文件上传配置
var FileUploadConfig = &FileUpload{}

type FileUpload struct {
	// 上传路径
	UploadPath string `json:"uploadPath"`
	// 预览路径
	PreviewPath string `json:"previewPath"`
}

// ServerConfig 文件上传配置
var ServerConfig = &Server{}

type Server struct {
	Host string `json:"host"`
}
